package com.self.shortlink.project.mq.producer;

import com.alibaba.fastjson2.JSON;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.common.message.MessageConst;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

import java.util.Map;
import java.util.UUID;

/**
 * 短链接监控状态保存消息队列生产者
 */
@Slf4j
@Component
@RequiredArgsConstructor
public class ShortLinkStatsSaveProducer {

//    private final StringRedisTemplate stringRedisTemplate;
    private final RocketMQTemplate rocketMQTemplate;

    @Value("${rocketmq.producer.topic}")
    private String statsSaveTopic;

    /**
     * 发送延迟消费短链接统计
     */
    // producerMap 记录短链接统计信息的实体
    public void send(Map<String, String> producerMap) {
        // 统计实体添加唯一标识 keys
        String keys = UUID.randomUUID().toString();
        producerMap.put("keys", keys);
        Message<Map<String, String>> build = MessageBuilder
                .withPayload(producerMap)                    // 设置消息体
                .setHeader(MessageConst.PROPERTY_KEYS, keys) // 设置消息的keys
                .build();
        // 消息发送后的返回结果对象
        SendResult sendResult;

        try {
            // syncSend 同步机制发送消息， statsSaveTopic 是消息主题（统计信息）， build 是消息对象
            sendResult = rocketMQTemplate.syncSend(statsSaveTopic, build, 2000L);
            log.info("[消息访问统计监控] 消息发送结果： {}， 消息ID： {}， 消息Keys: {}",sendResult.getSendStatus(), sendResult.getMsgId(), keys);
        } catch (Throwable ex) {
            log.error("[消息访问统计监控] 消息发送失败, 消息体： {}", JSON.toJSONString(producerMap), ex);
            throw new RuntimeException("发送延迟消费短链接统计失败");
        }
    }
}
